perm filename FOO.SAI[AL,HE] blob
sn#738214 filedate 1984-01-10 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 BEGIN "PUPSUB"
C00011 ENDMK
C⊗;
BEGIN "PUPSUB"
REQUIRE "PUPDEF[HDR,HE]" SOURCE_FILE;
DEFINE CRLF="('15&'12)",
! = "COMMENT ";
PROCEDURE SNOOZE(INTEGER TIME(0));
Comment sleeps for 1/60 of a second (until next tick, I guess);
Comment unless argument is nonzero, then it sleeps that many seconds;
BEGIN "SNOOZE"
QUICK_CODE "SLEEP"
MOVE '13,TIME;
CALLI '13,'31
END "SLEEP";
END "SNOOZE"; Comment what a kludge;
STRING NAME;
INTEGER ARRAY HOSTSOCKET[0:5];
BOOLEAN FOUND;
STRING ERRMESS;
EXTERNAL INTEGER _SKIP_;
INTEGER ARRAY PUP[0:MAXPUPWORDS];
INTEGER ARRAY MTP[0:6];
INTEGER OPCODE,COUNT,BRCHAR,EOF,LEN,PUPCHN,I,J,PTR,NCHAR,HOST,PUPS,NET;
BOOLEAN GOTIT;
COMMENT Call the name server to look up the name NAME. If found, return
FOUND=TRUE and return the first host/socket found in HOSTSOCKET[0..5].
If not found, return FOUND=FALSE and the returned error message in
ERRMESS. ;
PUPS ← 0;
NAME ← "UBEHEBE";
PUPCHN ← GETCHAN;
EOF ← 1;
OPEN(PUPCHN,"PUP",'15,0,0,COUNT,BRCHAR,EOF);
IF EOF NEQ 0 THEN
BEGIN
FOUND ← FALSE;
PRINT("OPEN failed on PUP"&CRLF);
END
ELSE BEGIN
COMMENT Set up an MTAPE to open a connection with the misc. services;
MTP[0] ← PUPLISTEN; COMMENT Function;
MTP[2] ← -1; COMMENT Local socket number (generate one);
MTP[3] ← 0; COMMENT Wait flag;
MTP[4] ← 8; COMMENT Byte size;
MTP[5] ← MISCSERV; COMMENT Remote socket number (misc. services);
MTP[6] ← -1; COMMENT Remote host (broadcast);
COMMENT Set up MTAPE uuo...;
OPCODE ← '072000000000 + (PUPCHN LSH 23);
CODE(OPCODE,MTP[0]);
IF MTP[1] NEQ 0 THEN
BEGIN
FOUND ← FALSE;
ERRMESS ← "Failed to connect to name server";
END
ELSE BEGIN
COMMENT Set up the PUP to send the name request;
PRINT("Using socket #",CVOS(MTP[2]),CRLF);
NCHAR ← LENGTH(NAME);
DPB(NCHAR+PUPOVERHEAD,POINT(16,PUP[0],15)); COMMENT Length in bytes;
DPB(NAMEREQUEST,POINT(16,PUP[0],31)); COMMENT PUP type;
FOR I ← 1 STEP 1 UNTIL 4 DO PUP[I] ← 0; COMMENT Let WAITS fill in the rest;
PTR ← POINT(8,PUP[5],-1);
FOR I ← 1 STEP 1 UNTIL NCHAR DO IDPB(LOP(NAME),PTR);
ARRYOUT(PUPCHN,PUP[0],(NCHAR+PUPOVERHEAD+3) DIV 4);
IF EOF NEQ 0 THEN
BEGIN
FOUND ← FALSE;
PRINT("Output to PUP failed"&CRLF);
END
ELSE
DO
BEGIN
COMMENT Get reply from misc. server;
MTP[0] ← SKIPREADY;
CODE(OPCODE,MTP[0]);
IF _SKIP_ = 0 THEN
BEGIN
SNOOZE(1);
CODE(OPCODE,MTP[0]);
IF _SKIP_ = 0 THEN
BEGIN
SNOOZE(1);
CODE(OPCODE,MTP[0]);
IF _SKIP_ = 0 THEN
GOTIT ← FALSE
ELSE
GOTIT ← TRUE
END
ELSE
GOTIT ← TRUE
END
ELSE
GOTIT ← TRUE;
IF NOT GOTIT THEN
BEGIN
FOUND ← FALSE;
PRINT("No reply from name server"&CRLF);
END
ELSE
BEGIN
COMMENT Receive the PUP;
ARRYIN(PUPCHN,PUP[0],MAXPUPWORDS);
HOST ← LDB(POINT(8,PUP[3],31));
PRINT("Received a reply from host = ",HOST,CRLF);
J ← (LDB(POINT(16,PUP[2],31)) LSH 16) LOR LDB(POINT(16,PUP[3],15));
PRINT("Using socket #",CVOS(J),CRLF);
COMMENT Extract PUP type, check if successful;
IF LDB(POINT(8,PUP[0],31)) = NAMEREPLY THEN
BEGIN
FOUND ← TRUE;
PTR ← POINT(8,PUP[5],-1);
FOR I ← 0 STEP 1 UNTIL 5 DO
PRINT(" ",(HOSTSOCKET[I] ← ILDB(PTR)));
PRINT(CRLF);
IF PUPS = 0 THEN
BEGIN
PUPS ← 1;
RELEASE(PUPCHN);
OPEN(PUPCHN,"PUP",'15,0,0,COUNT,BRCHAR,EOF);
IF EOF NEQ 0 THEN
BEGIN
FOUND ← FALSE;
PRINT("OPEN failed on PUP"&CRLF);
END;
! Set up an MTAPE to open a connection with whoever replied;
MTP[0] ← 0; COMMENT Connect Function;
MTP[2] ← J; COMMENT Keep old local socket number;
MTP[3] ← 0; COMMENT Wait flag;
MTP[4] ← 8; COMMENT Byte size;
MTP[5] ← MISCSERV; COMMENT Remote socket number (misc. services);
MTP[6] ← HOST; COMMENT Remote host who replied;
COMMENT Set up MTAPE uuo...;
OPCODE ← '072000000000 + (PUPCHN LSH 23);
CODE(OPCODE,MTP[0]);
IF MTP[1] NEQ 0 THEN
BEGIN
FOUND ← FALSE;
ERRMESS ← "Failed to connect to individual name server";
END
ELSE PRINT("Opened connection ok",CRLF);
NAME ← "UBEHEBE";
NCHAR ← LENGTH(NAME);
DPB(NCHAR+PUPOVERHEAD,POINT(16,PUP[0],15)); COMMENT Length in bytes;
DPB(NAMEREQUEST,POINT(16,PUP[0],31)); COMMENT PUP type;
FOR I ← 1 STEP 1 UNTIL 4 DO PUP[I] ← 0; COMMENT Let WAITS fill in the rest;
PTR ← POINT(8,PUP[5],-1);
FOR I ← 1 STEP 1 UNTIL NCHAR DO IDPB(LOP(NAME),PTR);
ARRYOUT(PUPCHN,PUP[0],(NCHAR+PUPOVERHEAD+3) DIV 4);
IF EOF NEQ 0 THEN
BEGIN
FOUND ← FALSE;
PRINT("Output to PUP failed"&CRLF);
END;
END
END
ELSE
BEGIN
FOUND ← FALSE;
LEN ← LDB(POINT(16,PUP[0],15))-PUPOVERHEAD;
PTR ← POINT(8,PUP[5],-1);
ERRMESS ← NULL;
FOR I ← 1 STEP 1 UNTIL LEN DO ERRMESS ← ERRMESS & ILDB(PTR);
PRINT(ERRMESS,CRLF);
END;
END
END UNTIL NOT GOTIT
END END;
RELEASE(PUPCHN);
END "PUPSUB"